#include<bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define yes cout<<"YES\n"
#define no cout<<"NO\n"
#define ll long long
#define ld long double
#define L "\n"
#define F first
#define S second
#define pb push_back
const int N=5e5+50;
ll n,m,x,y,cnt;
ll sz;
ll ans[N],val[N];
ll freq[N];
struct qu{
ll l,r,ind;
};
qu q[N];
bool cmp(qu &a,qu &b)
{
if(a.l/sz==b.l/sz) return a.r<b.r;
return a.l<b.l;
}
void add(ll ind)
{
ll x=val[ind];
if(x>n) return ;
if(freq[x]==x) cnt--;
freq[x]++;
if(freq[x]==x) cnt++;
return ;
}
void rem(ll ind)
{
ll x=val[ind];
if(x>n) return ;
if(freq[x]==x) cnt--;
freq[x]--;
if(freq[x]==x) cnt++;
return ;
}
int main()
{
IOS
ll T = 1 ;
//cin >> T ;
while(T--)
{
cin>>n>>m;
sz=sqrt(n)+1;
for(ll i=0 ; i<n ; i++)
{
cin>>val[i];
}
for(ll i=0 ; i<m ; i++)
{
cin>>q[i].l>>q[i].r;
q[i].l--;
q[i].r--;
q[i].ind=i;
}
sort(q,q+m,cmp);
ll l=0,r=-1;
for(ll i=0 ; i<m ; i++)
{
while(r<q[i].r)
{
r++;
add(r);
}
while(r>q[i].r)
{
rem(r);
r--;
}
while(l<q[i].l)
{
rem(l);
l++;
}
while(l>q[i].l)
{
l--;
add(l);
}
ans[q[i].ind]=cnt;
}
for(ll i=0 ; i<m ; i++) cout<<ans[i]<<L;
}
}
237A - Free Cash | 1615B - And It's Non-Zero |
1619E - MEX and Increments | 34B - Sale |
1436A - Reorder | 1363C - Game On Leaves |
1373C - Pluses and Minuses | 1173B - Nauuo and Chess |
318B - Strings of Power | 1625A - Ancient Civilization |
864A - Fair Game | 1663B - Mike's Sequence |
448A - Rewards | 1622A - Construct a Rectangle |
1620A - Equal or Not Equal | 1517A - Sum of 2050 |
620A - Professor GukiZ's Robot | 1342A - Road To Zero |
1520A - Do Not Be Distracted | 352A - Jeff and Digits |
1327A - Sum of Odd Integers | 1276A - As Simple as One and Two |
812C - Sagheer and Nubian Market | 272A - Dima and Friends |
1352C - K-th Not Divisible by n | 545C - Woodcutters |
1528B - Kavi on Pairing Duty | 339B - Xenia and Ringroad |
189A - Cut Ribbon | 1182A - Filling Shapes |